{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Resize Reindex and ROI extraction\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Once deleted, variables cannot be recovered. Proceed (y/[n])? y\n",
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%reset\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "import numpy as np\n",
    "import os\n",
    "import glob\n",
    "import SimpleITK as sitk\n",
    "import sys\n",
    "import sys\n",
    "sys.path.insert(0, '../../../dataloaders/')\n",
    "import niftiio as nio"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "IMG_FOLDER = \"./tmp_normalized/\"\n",
    "SEG_FOLDER = IMG_FOLDER\n",
    "imgs = glob.glob(IMG_FOLDER + \"/image_*.nii.gz\")\n",
    "segs = glob.glob(SEG_FOLDER + \"/label_*.nii.gz\")\n",
    "\n",
    "pids = [pid.split(\"_\")[-1].split(\".\")[0] for pid in imgs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "imgs = sorted(imgs, key = lambda x: int(os.path.basename(x).split('.')[0].split('_')[-1]) )\n",
    "segs = sorted(segs, key = lambda x: int(os.path.basename(x).split('.')[0].split('_')[-1]) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./tmp_normalized/image_1.nii.gz',\n",
       " './tmp_normalized/image_2.nii.gz',\n",
       " './tmp_normalized/image_3.nii.gz',\n",
       " './tmp_normalized/image_5.nii.gz',\n",
       " './tmp_normalized/image_8.nii.gz',\n",
       " './tmp_normalized/image_10.nii.gz',\n",
       " './tmp_normalized/image_13.nii.gz',\n",
       " './tmp_normalized/image_15.nii.gz',\n",
       " './tmp_normalized/image_19.nii.gz',\n",
       " './tmp_normalized/image_20.nii.gz',\n",
       " './tmp_normalized/image_21.nii.gz',\n",
       " './tmp_normalized/image_22.nii.gz',\n",
       " './tmp_normalized/image_31.nii.gz',\n",
       " './tmp_normalized/image_32.nii.gz',\n",
       " './tmp_normalized/image_33.nii.gz',\n",
       " './tmp_normalized/image_34.nii.gz',\n",
       " './tmp_normalized/image_36.nii.gz',\n",
       " './tmp_normalized/image_37.nii.gz',\n",
       " './tmp_normalized/image_38.nii.gz',\n",
       " './tmp_normalized/image_39.nii.gz']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./tmp_normalized/label_1.nii.gz',\n",
       " './tmp_normalized/label_2.nii.gz',\n",
       " './tmp_normalized/label_3.nii.gz',\n",
       " './tmp_normalized/label_5.nii.gz',\n",
       " './tmp_normalized/label_8.nii.gz',\n",
       " './tmp_normalized/label_10.nii.gz',\n",
       " './tmp_normalized/label_13.nii.gz',\n",
       " './tmp_normalized/label_15.nii.gz',\n",
       " './tmp_normalized/label_19.nii.gz',\n",
       " './tmp_normalized/label_20.nii.gz',\n",
       " './tmp_normalized/label_21.nii.gz',\n",
       " './tmp_normalized/label_22.nii.gz',\n",
       " './tmp_normalized/label_31.nii.gz',\n",
       " './tmp_normalized/label_32.nii.gz',\n",
       " './tmp_normalized/label_33.nii.gz',\n",
       " './tmp_normalized/label_34.nii.gz',\n",
       " './tmp_normalized/label_36.nii.gz',\n",
       " './tmp_normalized/label_37.nii.gz',\n",
       " './tmp_normalized/label_38.nii.gz',\n",
       " './tmp_normalized/label_39.nii.gz']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "segs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# helper functions copy pasted\n",
    "def resample_by_res(mov_img_obj, new_spacing, interpolator = sitk.sitkLinear, logging = True):\n",
    "    resample = sitk.ResampleImageFilter()\n",
    "    resample.SetInterpolator(interpolator)\n",
    "    resample.SetOutputDirection(mov_img_obj.GetDirection())\n",
    "    resample.SetOutputOrigin(mov_img_obj.GetOrigin())\n",
    "    mov_spacing = mov_img_obj.GetSpacing()\n",
    "\n",
    "    resample.SetOutputSpacing(new_spacing)\n",
    "    RES_COE = np.array(mov_spacing) * 1.0 / np.array(new_spacing)\n",
    "    new_size = np.array(mov_img_obj.GetSize()) *  RES_COE \n",
    "\n",
    "    resample.SetSize( [int(sz+1) for sz in new_size] )\n",
    "    if logging:\n",
    "        print(\"Spacing: {} -> {}\".format(mov_spacing, new_spacing))\n",
    "        print(\"Size {} -> {}\".format( mov_img_obj.GetSize(), new_size ))\n",
    "\n",
    "    return resample.Execute(mov_img_obj)\n",
    "\n",
    "def resample_lb_by_res(mov_lb_obj, new_spacing, interpolator = sitk.sitkLinear, ref_img = None, logging = True):\n",
    "    src_mat = sitk.GetArrayFromImage(mov_lb_obj)\n",
    "    lbvs = np.unique(src_mat)\n",
    "    if logging:\n",
    "        print(\"Label values: {}\".format(lbvs))\n",
    "    for idx, lbv in enumerate(lbvs):\n",
    "        _src_curr_mat = np.float32(src_mat == lbv) \n",
    "        _src_curr_obj = sitk.GetImageFromArray(_src_curr_mat)\n",
    "        _src_curr_obj.CopyInformation(mov_lb_obj)\n",
    "        _tar_curr_obj = resample_by_res( _src_curr_obj, new_spacing, interpolator, logging )\n",
    "        _tar_curr_mat = np.rint(sitk.GetArrayFromImage(_tar_curr_obj)) * lbv\n",
    "        if idx == 0:\n",
    "            out_vol = _tar_curr_mat\n",
    "        else:\n",
    "            out_vol[_tar_curr_mat == lbv] = lbv\n",
    "    out_obj = sitk.GetImageFromArray(out_vol)\n",
    "    out_obj.SetSpacing( _tar_curr_obj.GetSpacing() )\n",
    "    if ref_img != None:\n",
    "        out_obj.CopyInformation(ref_img)\n",
    "    return out_obj\n",
    "        \n",
    "## Then crop ROI\n",
    "def get_label_center(label):\n",
    "    nnz = np.sum(label > 1e-5)\n",
    "    return np.int32(np.rint(np.sum(np.nonzero(label), axis = 1) * 1.0 / nnz))\n",
    "\n",
    "def image_crop(ori_vol, crop_size, referece_ctr_idx, padval = 0., only_2d = True):\n",
    "    \"\"\" crop a 3d matrix given the index of the new volume on the original volume\n",
    "        Args:\n",
    "            refernce_ctr_idx: the center of the new volume on the original volume (in indices)\n",
    "            only_2d: only do cropping on first two dimensions\n",
    "    \"\"\"\n",
    "    #_expand_cropsize = [x + 1 for x in crop_size] # to deal with boundary case\n",
    "    _expand_cropsize = [x  for x in crop_size] # to deal with boundary case\n",
    "    if only_2d:\n",
    "        assert len(crop_size) == 2, \"Actual len {}\".format(len(crop_size))\n",
    "        assert len(referece_ctr_idx) == 2, \"Actual len {}\".format(len(referece_ctr_idx))\n",
    "        _expand_cropsize.append(ori_vol.shape[-1])\n",
    "        \n",
    "    image_patch = np.zeros(tuple(_expand_cropsize)).fi\n",
    "\n",
    "    half_size = tuple( [int(x * 1.0 / 2) for x in _expand_cropsize] )\n",
    "    _min_idx = [0,0,0]\n",
    "    _max_idx = list(ori_vol.shape)\n",
    "\n",
    "    # bias of actual cropped size to the beginning and the end of this volume\n",
    "    _bias_start = [0,0,0]\n",
    "    _bias_end = [0,0,0]\n",
    "\n",
    "    for dim,hsize in enumerate(half_size):\n",
    "        if dim == 2 and only_2d:\n",
    "            break\n",
    "\n",
    "        _bias_start[dim] = np.min([hsize, referece_ctr_idx[dim]])\n",
    "        _bias_end[dim] = np.min([hsize, ori_vol.shape[dim] - referece_ctr_idx[dim]])\n",
    "\n",
    "        _min_idx[dim] = referece_ctr_idx[dim] - _bias_start[dim]\n",
    "        _max_idx[dim] = referece_ctr_idx[dim] + _bias_end[dim]\n",
    "        \n",
    "    if only_2d:\n",
    "        image_patch[ half_size[0] - _bias_start[0]: half_size[0] +_bias_end[0], \\\n",
    "                half_size[1] - _bias_start[1]: half_size[1] +_bias_end[1], ... ] = \\\n",
    "                ori_vol[ referece_ctr_idx[0] - _bias_start[0]: referece_ctr_idx[0] +_bias_end[0], \\\n",
    "                referece_ctr_idx[1] - _bias_start[1]: referece_ctr_idx[1] +_bias_end[1], ... ]\n",
    "\n",
    "        image_patch = image_patch[ 0: crop_size[0], 0: crop_size[1], : ]\n",
    "    # then goes back to original volume\n",
    "    else:\n",
    "        image_patch[ half_size[0] - _bias_start[0]: half_size[0] +_bias_end[0], \\\n",
    "                half_size[1] - _bias_start[1]: half_size[1] +_bias_end[1], \\\n",
    "                half_size[2] - _bias_start[2]: half_size[2] +_bias_end[2] ] = \\\n",
    "                ori_vol[ referece_ctr_idx[0] - _bias_start[0]: referece_ctr_idx[0] +_bias_end[0], \\\n",
    "                referece_ctr_idx[1] - _bias_start[1]: referece_ctr_idx[1] +_bias_end[1], \\\n",
    "                referece_ctr_idx[2] - _bias_start[2]: referece_ctr_idx[2] +_bias_end[2] ]\n",
    "\n",
    "        image_patch = image_patch[ 0: crop_size[0], 0: crop_size[1], 0: crop_size[2] ]\n",
    "    return image_patch\n",
    "\n",
    "   \n",
    "    \n",
    "def copy_spacing_ori(src, dst):\n",
    "    dst.SetSpacing(src.GetSpacing())\n",
    "    dst.SetOrigin(src.GetOrigin())\n",
    "    dst.SetDirection(src.GetDirection())\n",
    "    return dst\n",
    "\n",
    "\n",
    "def z_crop(x_in, labels):\n",
    "    slc_list = []\n",
    "    for ii in range(x_in.shape[0]):\n",
    "        for lbv in labels:\n",
    "            if lbv in np.unique(np.int32(x_in[ii])):\n",
    "                slc_list.append(ii)\n",
    "                break\n",
    "                \n",
    "    min_slc = np.min(slc_list)\n",
    "    max_slc = np.max(slc_list)\n",
    "    return min_slc, max_slc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 37) -> [192. 192.  37.]\n",
      "./processed/image_0.nii.gz has been saved\n",
      "./processed/label_0.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "./processed/image_1.nii.gz has been saved\n",
      "./processed/label_1.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "./processed/image_2.nii.gz has been saved\n",
      "./processed/label_2.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "./processed/image_3.nii.gz has been saved\n",
      "./processed/label_3.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "./processed/image_4.nii.gz has been saved\n",
      "./processed/label_4.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "./processed/image_5.nii.gz has been saved\n",
      "./processed/label_5.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "./processed/image_6.nii.gz has been saved\n",
      "./processed/label_6.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "./processed/image_7.nii.gz has been saved\n",
      "./processed/label_7.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 36) -> [192. 192.  36.]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./processed/image_8.nii.gz has been saved\n",
      "./processed/label_8.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "./processed/image_9.nii.gz has been saved\n",
      "./processed/label_9.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 33) -> [192. 192.  33.]\n",
      "./processed/image_10.nii.gz has been saved\n",
      "./processed/label_10.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "./processed/image_11.nii.gz has been saved\n",
      "./processed/label_11.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "./processed/image_12.nii.gz has been saved\n",
      "./processed/label_12.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 46) -> [192. 192.  46.]\n",
      "./processed/image_13.nii.gz has been saved\n",
      "./processed/label_13.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 34) -> [192. 192.  34.]\n",
      "./processed/image_14.nii.gz has been saved\n",
      "./processed/label_14.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 35) -> [192. 192.  35.]\n",
      "./processed/image_15.nii.gz has been saved\n",
      "./processed/label_15.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 45) -> [192. 192.  45.]\n",
      "./processed/image_16.nii.gz has been saved\n",
      "./processed/label_16.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 38) -> [192. 192.  38.]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./processed/image_17.nii.gz has been saved\n",
      "./processed/label_17.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 40) -> [192. 192.  40.]\n",
      "./processed/image_18.nii.gz has been saved\n",
      "./processed/label_18.nii.gz has been saved\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Label values: [0. 1. 2. 3. 4.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "Spacing: (1.25, 1.25, 7.699999809265137) -> [1.6666666666666665, 1.6666666666666665, 7.699999809265137]\n",
      "Size (256, 256, 31) -> [192. 192.  31.]\n",
      "./processed/image_19.nii.gz has been saved\n",
      "./processed/label_19.nii.gz has been saved\n"
     ]
    }
   ],
   "source": [
    "import copy\n",
    "OUT_FOLDER = \"./processed\"\n",
    "scan_dir = OUT_FOLDER\n",
    "os.makedirs(scan_dir, exist_ok = True)\n",
    "BD_BIAS = 0# cut irrelavent empty boundary to make roi stands out\n",
    "\n",
    "SPA_FAC = 256 / 192 # spacing factor\n",
    "\n",
    "new_scanid = 0 #use a new scan id\n",
    "for img_fid, seg_fid, pid in zip(imgs, segs, pids):\n",
    "\n",
    "    lb_n = nio.read_nii_bysitk(seg_fid)\n",
    "\n",
    "    img_obj = sitk.ReadImage( img_fid )\n",
    "    seg_obj = sitk.ReadImage( seg_fid )\n",
    "\n",
    "    ## image\n",
    "    array = sitk.GetArrayFromImage(img_obj)\n",
    "\n",
    "\n",
    "    ## label\n",
    "    lb_arr = sitk.GetArrayFromImage(seg_obj)\n",
    "    \n",
    "    # cropping\n",
    "    array = array[:, : 256, : 256]\n",
    "    cropped_img_o = sitk.GetImageFromArray(array)\n",
    "    cropped_img_o = copy_spacing_ori(img_obj, cropped_img_o)\n",
    "\n",
    "    # resampling\n",
    "    img_spa_ori = img_obj.GetSpacing()\n",
    "    res_img_o = resample_by_res(cropped_img_o, [img_spa_ori[0] * SPA_FAC, img_spa_ori[1] * SPA_FAC, img_spa_ori[-1]], interpolator = sitk.sitkLinear,\n",
    "                                    logging = True)\n",
    "    \n",
    "    lb_arr = lb_arr[:,: 256, : 256]\n",
    "    cropped_lb_o = sitk.GetImageFromArray(lb_arr)\n",
    "    cropped_lb_o = copy_spacing_ori(seg_obj, cropped_lb_o)\n",
    "\n",
    "    lb_spa_ori = seg_obj.GetSpacing()\n",
    "\n",
    "    # resampling\n",
    "    res_lb_o = resample_lb_by_res(cropped_lb_o,  [lb_spa_ori[0] * SPA_FAC, lb_spa_ori[1] * SPA_FAC, lb_spa_ori[-1] ], interpolator = sitk.sitkLinear,\n",
    "                                  ref_img = res_img_o, logging = True)\n",
    "    \n",
    "    # in case of resampling bug\n",
    "    res_img_a = sitk.GetArrayFromImage(res_img_o)[: , : 192, : 192]\n",
    "    res_lb_a = sitk.GetArrayFromImage(res_lb_o)[: , : 192, : 192]\n",
    "    \n",
    "    \n",
    "    ## ROI\n",
    "    min_slc, max_slc = z_crop(res_lb_a, labels = [1,2,3,4])\n",
    "    res_img_a  = res_img_a[min_slc: max_slc, ...]\n",
    "    res_lb_a = res_lb_a[min_slc: max_slc, ...]\n",
    "    \n",
    "    out_img_o = sitk.GetImageFromArray(res_img_a)\n",
    "    out_img_o = copy_spacing_ori(img_obj, out_img_o)\n",
    "\n",
    "    out_lb_o = sitk.GetImageFromArray(res_lb_a)\n",
    "    out_lb_o = copy_spacing_ori(img_obj, out_lb_o)\n",
    "   \n",
    "    \n",
    "    out_img_fid = os.path.join( scan_dir, f'image_{new_scanid}.nii.gz' )\n",
    "    out_lb_fid  = os.path.join( scan_dir, f'label_{new_scanid}.nii.gz' ) \n",
    "    \n",
    "    # then save\n",
    "    sitk.WriteImage(out_img_o, out_img_fid, True) \n",
    "    sitk.WriteImage(out_lb_o, out_lb_fid, True) \n",
    "    print(\"{} has been saved\".format(out_img_fid))\n",
    "    print(\"{} has been saved\".format(out_lb_fid))\n",
    "    new_scanid += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sanity check passed"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
